package chemtools_logica.BDL.SFBean;

import chemtools_logica.BDL.IL.BDL_SFTipoproductoLocal;
import chemtools_logica.BDL.IR.BDL_SFTipoproductoRemote;

import chemtools_logica.Entidades.Graficoempresas;
import chemtools_logica.Entidades.Graficotipoinsumo;
import chemtools_logica.Entidades.Insumo;
import chemtools_logica.Entidades.Tipoinsumo;
import chemtools_logica.Entidades.Tipoproducto;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.annotation.Resource;

import javax.ejb.SessionContext;
import javax.ejb.Stateless;

import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

@Stateless(name = "BDL_SFTipoproducto", mappedName = "map-BDL_SFTipoproducto")
public class BDL_SFTipoproductoBean implements BDL_SFTipoproductoRemote, BDL_SFTipoproductoLocal {
    @Resource
    SessionContext sessionContext;
    @PersistenceContext(unitName = "Chemtools_Logica")
    private EntityManager em;

    public BDL_SFTipoproductoBean() {
    }

    public Tipoproducto persistTipoproducto(Tipoproducto tipoproducto) {
        em.persist(tipoproducto);
        return tipoproducto;
    }

    public Tipoproducto mergeTipoproducto(Tipoproducto tipoproducto) {
        return em.merge(tipoproducto);
    }

    /** <code>select o from Tipoproducto o</code> */
    @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
    public List<Tipoproducto> getTipoproductoFindAll() {
        return em.createNamedQuery("Tipoproducto.findAll", Tipoproducto.class).getResultList();
    }
    
    public List<Tipoproducto> tipoProductosActivos(){
        List<Tipoproducto> tipoProductos = new ArrayList<Tipoproducto>();
        String ejb = "SELECT u.* FROM tipoproducto u INNER JOIN medida m ON " + 
                        " m.idMedida = u.idMedida";
        try{
            Query query = em.createNativeQuery(ejb, Tipoproducto.class);            
            tipoProductos = query.getResultList();
            
            return tipoProductos;
        }catch(Exception e)
        {
            tipoProductos = null;
        }
        return tipoProductos;

    }

    
    public double getSumaContenidoProd(int idTipoProd){
        String ejb="SELECT sum(p.Contenido) FROM producto p, tipoproducto tp WHERE p.idTipoProducto = tp.idTipoProducto";
        
        Query query = em.createNativeQuery(ejb);
        Long i = (Long)query.getSingleResult();
        
        double cantidad = i.doubleValue();
        return cantidad;
    }

    
    public List<Tipoproducto> tipoProductosSinFormulaActivos(){
            System.out.println("llego DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD");
            String ejbQuery = "SELECT u FROM Tipoproducto u " +
                              "WHERE u.estado = 1 " +
                              "and u.idTipoProducto " +
                              "not in(Select d.tipoproducto.idTipoProducto from Detalleformula d where d.formula.estado = "+ 1 +")";
            //String ejb = "SELECT u FROM Tipoproducto u, Detalleformula e WHERE u.estado = 1 and e.tipoproducto.idTipoProducto != u.idTipoProducto";
            return em.createQuery(ejbQuery,Tipoproducto.class).getResultList();
            
        }
    public Tipoproducto buscaxIdTipoproducto(int idTipoproducto){
            String ejbQuery = "SELECT u FROM Tipoproducto u WHERE u.idTipoProducto="+idTipoproducto;
            Tipoproducto tp = em.createQuery(ejbQuery,Tipoproducto.class).getSingleResult();
        return tp;
        }
    
    public List<Tipoproducto> tipoProductoxOrdenProduccion(int idOrdenProduccion){
        List<Tipoproducto> listaTipoproducto = new ArrayList<Tipoproducto>();
        String ejb = "SELECT t.* FROM tipoproductoxordenproduccion op " + 
                     "INNER JOIN tipoproducto t " + 
                     "on t.idTipoProducto = op.idTipoProducto " + 
                     "where op.idOrdenProduccion ="+ idOrdenProduccion;

        Query query = em.createNativeQuery(ejb, Tipoproducto.class);            
        listaTipoproducto = query.getResultList();
        
        return listaTipoproducto;
    }
    
    public List<Tipoproducto> tipoProductoxOrdenProduccionConMedida(int idOrdenProduccion){
        List<Tipoproducto> listaTipoproducto = new ArrayList<Tipoproducto>();
        String ejb = "SELECT t.* FROM tipoproductoxordenproduccion op " + 
                     "INNER JOIN tipoproducto t " + 
                     "INNER JOIN medida m " +
                     "INNER JOIN contenedores c " +
                     "on t.idTipoProducto = op.idTipoProducto " + 
                     "and m.idMedida = t.idMedida " + 
                     "and c.idContenedores = t.idContenedores " +
                     "where op.idOrdenProduccion ="+ idOrdenProduccion;

        Query query = em.createNativeQuery(ejb, Tipoproducto.class);            
        listaTipoproducto = query.getResultList();
        
        return listaTipoproducto;
    }
    
    public List<Tipoproducto> tipoProductosActivosConMedida(){
        List<Tipoproducto> listaProductos = new ArrayList<Tipoproducto>();
        String ejb = "SELECT tp.* FROM tipoproducto tp "+
                     "INNER JOIN medida m "+
                     "INNER JOIN contenedores c "+
                     "ON tp.idMedida = m.idMedida "+
                     "AND tp.idContenedores = c.idContenedores "+
                     "WHERE tp.Estado = 1";
        
        Query query = em.createNativeQuery(ejb, Tipoproducto.class);            
        listaProductos = query.getResultList();
        
        return listaProductos;
    }
    
    public List<Graficotipoinsumo> getCharTipoProducto(String idAlmacen, Date fechaMin, Date fechaMax){
        List<Graficotipoinsumo> grafico = new ArrayList<Graficotipoinsumo>();
        String ejbQuery = "{CALL graficoTipoProducto(?,?,?)}";
             Query query = em.createNativeQuery(ejbQuery, Graficotipoinsumo.class);
             query.setParameter(1, idAlmacen);
             query.setParameter(2, fechaMin);
             query.setParameter(3, fechaMax);
             grafico = query.getResultList();

        return grafico;
    }
    
    public List<Graficoempresas> getChartTProductoEmpresas(Date fechaMin, Date fechaMax){
        List<Graficoempresas> grafico = new ArrayList<Graficoempresas>();
        String ejbQuery = "{CALL graficoEmpresasProducto(?,?)}";
             Query query = em.createNativeQuery(ejbQuery, Graficoempresas.class);
             query.setParameter(1, fechaMin);
             query.setParameter(2, fechaMax);
             grafico = query.getResultList();

        return grafico;
    }
    
    public Tipoproducto getDetalleTProducto(String idTipoProducto){
        Tipoproducto entidad = new Tipoproducto();
        String ejbQuery = "SELECT ti.* " +
                        "FROM tipoproducto ti " +
                        "INNER JOIN medida m " +
                        "ON ti.idMedida = m.idMedida " +
                        "INNER JOIN contenedores c " +
                        "ON ti.idContenedores = c.idContenedores " +
                        "WHERE ti.idTipoProducto = "+idTipoProducto;
        try{
            Query query = em.createNativeQuery(ejbQuery,Tipoproducto.class);
            entidad = (Tipoproducto)query.getSingleResult();
        }catch(Exception e)
        {
            entidad = null;
        }
        
        return entidad;
    }

}
